{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Kernel methods are widespread in machine learning and they were particularly common before deep learning became a dominant paradigm. The core idea is to introduce a new notion of distance between high-dimensional data points by replacing the inner product $(x_i, x_j)$ by a function that retains many properties of the inner product, yet which is nonlinear. This function $k(.,.)$ is called a kernel. Then, in many cases, wherever a learning algorithm would use an inner product, the kernel function is used instead.\n",
    "\n",
    "The intuition is that the kernel function acts as an inner product on a higher dimensional space and encompasses some $\\phi(.)$ mapping from the original space of the data points to this space. So intuitively, the kernel function is $k(x_i, x_j)=(\\phi(x_i), \\phi(x_j))$. The hope is that points that were not linearly separable in the original space become linearly separable in the higher dimensional space. The $\\phi(.)$ function may map to an infinite dimensional space and it does not actually have to be specified. As long as the kernel function is positive semidefinite, the idea works.\n",
    "\n",
    "Many kernel-based learning algorithms are instance-based, which means that the final model retains some or all of the training instances and they play a role in the actual prediction. Support vector machines belong here: support vectors are the training instances which are critically important in defining the boundary between two classes. Some important kernels are listed below.\n",
    "\n",
    "| Name | &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Kernel function|\n",
    "|------|-----------------|\n",
    "|Linear | $(x_i,x_j)$|\n",
    "|Polynomial| $((x_i,x_j)+c)^d$|\n",
    "|Radial basis function|$\\exp(-\\gamma\\|x_i-x_j\\|^2)$|\n",
    "\n",
    "The choice of kernel and the parameters of the kernel are often arbitrary and either some trial and error on the dataset or hyperparameter optimization helps choose the right combination. Quantum computers naturally give rise to certain kernels and it is worth looking at a specific variant of how it is constructed.\n",
    "\n",
    "\n",
    "# Thinking backward: learning methods based on what the hardware can do\n",
    "\n",
    "Instead of twisting a machine learning algorithm until only contains subroutines that have quantum variants, we can reverse our thinking and ask: given a piece of quantum hardware and its constraints, can we come up with a new learning method? For instance, interference is a very natural thing to do: we showed an option in the first notebook on quantum states, and it can also be done with a Hadamard gate. For instance, imagine that you have training vectors encoded in some register, and this register is entangled with the $|0\\rangle$ in the superposition of an ancilla. The ancilla's $|1\\rangle$ of the superposition is entangled with another register that contains the test vector. Applying the Hadamard on the ancilla interferes the test and training instances. Measuring and post-selecting on the ancilla gives rise to a kernel [[1](#1)].\n",
    "\n",
    "Let's get the basic initialization out of the way:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:26.258897Z",
     "start_time": "2018-11-19T20:10:24.992179Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/marshmallow/schema.py:364: ChangedInMarshmallow3Warning: strict=False is not recommended. In marshmallow 3.0, schemas will always be strict. See https://marshmallow.readthedocs.io/en/latest/upgrading.html#schemas-are-always-strict\n",
      "  ChangedInMarshmallow3Warning\n"
     ]
    }
   ],
   "source": [
    "from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit\n",
    "from qiskit import execute\n",
    "from qiskit import BasicAer\n",
    "\n",
    "q = QuantumRegister(4)\n",
    "c = ClassicalRegister(4)\n",
    "backend = BasicAer.get_backend('qasm_simulator')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are constructing an instance-based classifier: we will calculate a kernel between all training instances and a test example. In this sense, this learning algorithm is lazy: no actual learning happens and each prediction includes the entire training set.\n",
    "\n",
    "As a consequence, state preparation is critical to this protocol. We have to encode the training instances in a superposition in a register, and the test instances in another register. Consider the following training instances of the [Iris dataset](https://archive.ics.uci.edu/ml/datasets/iris): $S = \\{(\\begin{bmatrix}0 \\\\ 1\\end{bmatrix}, 0), (\\begin{bmatrix}0.78861006 \\\\ 0.61489363\\end{bmatrix}, 1)\\}$, that is, one example from class 0 and one example from class 1. Furthermore, let's have two test instances, $\\{\\begin{bmatrix}-0.549\\\\ 0.836\\end{bmatrix}, \\begin{bmatrix}0.053 \\\\ 0.999\\end{bmatrix}\\}$. These examples were cherry-picked because they are relatively straightforward to prepare."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:26.266724Z",
     "start_time": "2018-11-19T20:10:26.261941Z"
    }
   },
   "outputs": [],
   "source": [
    "training_set = [[0, 1], [0.78861006, 0.61489363]]\n",
    "labels = [0, 1]\n",
    "test_set = [[-0.549, 0.836], [0.053 , 0.999]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " We use amplitude encoding, which means that, for instance, the second training vector will be encoded as $0.78861006|0\\rangle + 0.61489363|1\\rangle$. Preparing these vectors only needs a rotation, and we only need to specify the corresponding angles. The first element of the training set does not even need that: it is just the $|1\\rangle$ state, so we don't specify an angle for it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:26.293900Z",
     "start_time": "2018-11-19T20:10:26.268934Z"
    }
   },
   "outputs": [],
   "source": [
    "test_angles = [4.30417579487669/2, 3.0357101997648965/2]\n",
    "training_angle = 1.3245021469658966/4"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The following function does the state preparation. We plot it and explain it in more details below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:26.366286Z",
     "start_time": "2018-11-19T20:10:26.297453Z"
    }
   },
   "outputs": [],
   "source": [
    "def prepare_state(q, c, angles):\n",
    "    ancilla_qubit = q[0]\n",
    "    index_qubit = q[1]\n",
    "    data_qubit = q[2]\n",
    "    class_qubit = q[3]\n",
    "    qc = QuantumCircuit(q, c)\n",
    "    # Put the ancilla and the index qubits into uniform superposition\n",
    "    qc.h(ancilla_qubit)\n",
    "    qc.h(index_qubit)\n",
    "\n",
    "    # Prepare the test vector\n",
    "    qc.cx(ancilla_qubit, data_qubit)\n",
    "    qc.u3(-angles[0], 0, 0, data_qubit)\n",
    "    qc.cx(ancilla_qubit, data_qubit)\n",
    "    qc.u3(angles[0], 0, 0, data_qubit)\n",
    "    # Flip the ancilla qubit > this moves the input \n",
    "    # vector to the |0> state of the ancilla\n",
    "    qc.x(ancilla_qubit)\n",
    "    qc.barrier()\n",
    "\n",
    "    # Prepare the first training vector\n",
    "    # [0,1] -> class 0\n",
    "    # We can prepare this with a Toffoli\n",
    "    qc.ccx(ancilla_qubit, index_qubit, data_qubit)\n",
    "    # Flip the index qubit > moves the first training vector to the \n",
    "    # |0> state of the index qubit\n",
    "    qc.x(index_qubit)\n",
    "    qc.barrier()\n",
    "\n",
    "    # Prepare the second training vector\n",
    "    # [0.78861, 0.61489] -> class 1\n",
    "\n",
    "    qc.ccx(ancilla_qubit, index_qubit, data_qubit)\n",
    "    qc.cx(index_qubit, data_qubit)\n",
    "    qc.u3(angles[1], 0, 0, data_qubit)\n",
    "    qc.cx(index_qubit, data_qubit)\n",
    "    qc.u3(-angles[1], 0, 0, data_qubit)\n",
    "    qc.ccx(ancilla_qubit, index_qubit, data_qubit)\n",
    "    qc.cx(index_qubit, data_qubit)\n",
    "    qc.u3(-angles[1], 0, 0, data_qubit)\n",
    "    qc.cx(index_qubit, data_qubit)\n",
    "    qc.u3(angles[1], 0, 0, data_qubit)\n",
    "    qc.barrier()\n",
    "\n",
    "    # Flip the class label for training vector #2\n",
    "    qc.cx(index_qubit, class_qubit)\n",
    "    qc.barrier()\n",
    "    return qc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let us see the circuit for preparing state with the first test instance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:28.967561Z",
     "start_time": "2018-11-19T20:10:26.369401Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/qiskit/tools/visualization/_circuit_visualization.py:206: DeprecationWarning: The current behavior for the default output will change in a future release. Instead of trying latex and falling back to mpl on failure it will just use \"text\" by default\n",
      "  '\"text\" by default', DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "image/png": "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AAD6Iyf9UDwev/76699+++0QwqxZsxYsWFBWVtbQ0FBTU7N27dqampqysrLUnumuZejQob2e6pRTTkmfMxdRM5CPmQEAAAAAANKy3w91dXWlyqHi4uKVK1fec889R2995JFHVqxYccUVV6S+bGxsTC18bdfS2tp67Nb29vbOzs5Ro0ZlnHbJkiWLFy8OIZSUlPTxkH5mBgAAAAAAiFb2+6ElS5akZg6tXr36tttu67F16NCh999/f/rLjo6O1EIikej1bOn1R9+nLoTwq1/96l/+5V+qqqoSicT48eMXL158//33FxcXn2jaOXPmnOghGWfuo5/+9KerVq3K4MD+i8fjw4YN+6reayDo7u5ubW0dPXr0oEGDos7C8bS1tSWTyREjRkQdhONJJpMtLS2jRo0aPHhw1FkKkbdJ1uX0n3RevF8i/JTs6uo6fPjw6NGjc3Hyzs7Otra2HJ287/r/a0nkgnEZmIxLvuvo6Ghvbz/11FOjDkKGfHSSFS4F+c4IDkzG5WTK6QdiTocyg8/QzD52L7vssiz3Qzt37nziiSdCCDfeeOOx5dCx0onTpUsP6fVjxoxJLSQSiTvvvPOll1667rrr/vZv/3bkyJEvv/zyz372s02bNv3nf/5nUVFRFv4Y2c58Qm677bbTTz89s2z9VFVVNW7cuLFjx0by6n3R2dn50UcfXXLJJSdhoOmP3bt3J5PJCRMmRB2E40kkEu+///5FF100kFvhb7B9+/a1t7dXVFREHeSbI5lMvv/++9OnT8/g90W+Vur9UllZmZ4lPAC1t7d/8sknl1xyycnvhw4dOvTnP/955syZuTh5S0vLzp07L7zwwlycvO/q6upisdiUKVOijUEPdXV19fX1kydPjjoIX1JXV9fQ0DBp0qSog5ChhoaG2traCy64IOogZKi5uXnXrl0zZsyINsbBgwcbGxtdCvJXfX39/v37XQryV1NT0549e6ZPnx51EL7EuJxM8Xi8urr6oosuysXJczqUsVjs4MGDU6dOzekhIYQpU6ZkuR9atmxZatLMQw891Jf90w1b37uWp59++uWXX37hhRfuvvvu1Jof//jH11133euvv/6b3/zmrrvu6k/+vsgg8wm59NJLL7300syyAQAAAAAAfK1sTsJIJBKvvPJKCKGysvKyyy7ryyHpriUej/e6Q21tbWoh3bX84Ac/+OlPf5ouh9IrQwj/8z//k1HwE5NBZgAAAAAAgIEjm/OHqqqqYrFYCGHatGl9POTMM89MLVRXV1955ZXH7lBdXZ1aOO2001IL55133j//8z/32K2+vj4cdee3nMog8wl58sknV69enWm6fqmpqTn99NMjv0nxcXR0dOzatauiomIgP/6BEMKBAweSyeRZZ50VdRCOp7u7e8eOHePHjx82bFjUWQpRXV1dZ2fnOeecE3WQb45EIlFdXV1aWpqL+8ul3i8TJkwYyPdjbG9v371798SJE0/+XVgPHz78xRdfTJw4MRe3tmttbT148GDkN2NsbGyMx+Pjx4+PNgY9NDY2tra2lpaWRh2ELzEu+a65ubmpqcnNovNXPB6PxWLl5eXRxmhoaDh06JBLQf5qampqbm52KchfLS0t9fX1kV8K6MG4nEytra0HDhyYOHFiLk7e0tLS0NBQVlaWi5M3NTW1tLSc0H8/MzgkhDBr1qxs9kN79uxJLfT99rLp++Fu3bq11x3SXctxbnja0dHx61//OoRw88039/F1+yMrmY+jrKzs4osvzixbPw0ZMmTcuHFnnHFGJK/eF+3t7YMGDZo5c+aQIVm+NSLZtXPnzmQyGfnP8ji+7u7uZDJ54YUX5uKH6Xyt3bt3t7e3n3/++VEH+eZIJBKJRGL69OkjRozI+snz4v3S1tY2ePDgiy+++OT3Q/F4vLi4+JJLLsnFyZuamnbs2JGjhxv13f79++vr692Cf6DZv39/Q0PDid5lm1wzLvmurq6utrY28qfXkLGGhoZdu3ZVVlZGG6O2traxsdGlIH8dPHjwwIEDnpKSvxoaGnbv3p2jJ6+Qsfr6+j179hiXk6Opqam6ujpHP2nP6VAeOHCgrq6u75NwMjskhDB16tRs/pA9/cOIr3owz7GmTZtWXFx85MiRDz74oNcdqqqqQghjx479qp+gHThwYNGiRTt27PjRj3703e9+98RTn7D+Zz6+m2+++eQUXQAAAAAAQGHK5q+XTpkyJbXw2Wef9fGQYcOG3XjjjSGEt956q66ursfWvXv3vvfeeyGEm2+++djblfzwhz+84IILxo8f/9vf/nbRokWrVq3qV/o+609mAAAAAACAyGWzH5owYULqOQrr16/fsmXLsTt88sknK1as6LFy4cKFIYQjR44sW7asx6ZHH300mUyGEO69995jz9bW1jZ8+PBRo0YNGjSora2ttrY2K3+Kvsg4MwAAAAAAQOSy2Q8VFRU9/vjjIYSurq5rr7123bp1sVisra1t+/bta9asueWWWyorKz///PMeR91www3z588PISxfvvzoOUArVqx49tlnQwg33XTTVVdddezLbdiw4f3334/FYps2bfqv//qvyy677JNPPjnRzHfccUdpaWlpaWlNTU3fj8o4MwAAAAAAQOQGpSa7ZEsymbz++us3btzY69YxY8Y899xzt956a4/1+/btmzVrVmoC0MyZMysqKjZv3rxt27YQQllZ2TvvvHPWWWcd/3X/4z/+45Zbbpk5c+b7779/Qnd1mzNnzqZNm0II27dvnzhxYt8P7H9mAAAAAACASGS5HwohdHR0PP7440899VRjY2N65eTJk3/84x//5Cc/GT16dK9H7d+//6677vrDH/5w9Mp58+a98MIL3/72t7/2Rbu7u0ePHn348OHNmzfPmDGj72kz7of6nxkAAAAAACAS2e+HUjo7O6uqqmKx2JgxY8rKykpKSvpy1EcfffT666/X1dWNGzdu7ty5J9T0TJgwYffu3b/97W9/8IMfZJo6E/3JDAAAAAAAcPLlqh/Knffff/+SSy7psbK9vX3kyJHd3d01NTUTJkyIJBgAAAAAAEBeKIo6wAm7/fbb165d22PlqlWruru7p02bphwCAAAAAAA4vvzrhx555JE777zz9ttv//3vfx+Px+vr63/xi1/8wz/8w5AhQ55//vmo0wEAAAAAAAx0+Xd/uRDChg0b7rvvvpqamvSa8vLy559//nvf+150oQAAAAAAAPJDXvZDIYSOjo633nrr/fffHzJkyMUXX3z55ZePGDEi6lAAAAAAAAB54P8Dfe5RIoL05TQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<PIL.Image.Image image mode=RGB size=2229x445 at 0x7FF575376EB8>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from qiskit.tools.visualization import circuit_drawer\n",
    "angles = [test_angles[0], training_angle]\n",
    "state_preparation_0 = prepare_state(q, c, angles)\n",
    "circuit_drawer(state_preparation_0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The vertical lines are barriers to make sure that all gates are finished by that point. They also make a natural segmentation of the state preparation.\n",
    "\n",
    "The test instance is prepared until the first barrier. The ancilla and index qubits (registers 0 and 1) are put into the uniform superposition. The test instance is entangled with the ground state of the ancilla. \n",
    "\n",
    "Then between the first and second barriers, we prepare the state $|1\\rangle$, which is the first training instance, and entangle it with the excited state of the ancilla and the ground state of the index qubit with a Toffoli gate and a Pauli-X gate. The Toffoli gate is also called the controlled-controlled-not gate, describing its action.\n",
    "\n",
    "The third section prepares the second training instance and entangles it with the excited state of the ancilla and the index qubit.\n",
    "\n",
    "The final part flips the class qubit conditioned on the index qubit. This creates the connection between the encoded training instances and the corresponding class label."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# A natural kernel on a shallow circuit\n",
    "\n",
    "Having down the state preparation, the actual prediction is nothing but a Hadamard gate applied on the ancilla, followed by measurements. Since the ancilla is in a uniform superposition at the end of the state preparation and it is entangled with the registers encoding the test and training instances, applying a second Hadamard on the ancilla interferes the entangled registers. The state before the measurement is $\\frac{1}{2\\sqrt{2}}\\sum_{i=0}^1|0\\rangle|i\\rangle(|x_t\\rangle+|x_i\\rangle)|y_i\\rangle+|1\\rangle|i\\rangle(|x_t\\rangle-|x_i\\rangle)|y_i\\rangle$, where $|x_t\\rangle$ is the encoded test instance and $|x_i\\rangle$ is a training instance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:28.977139Z",
     "start_time": "2018-11-19T20:10:28.970385Z"
    }
   },
   "outputs": [],
   "source": [
    "def interfere_data_and_test_instances(qc, q, c, angles):\n",
    "    qc.h(q[0])\n",
    "    qc.barrier()\n",
    "    qc.measure(q, c)\n",
    "    return qc"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we measure the ancilla, the outcome probability of observing 0 will be $\\frac{1}{4N}\\sum_{i=1}^N |x_t + x_i|^2$. This creates a kernel of the following form:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:29.350842Z",
     "start_time": "2018-11-19T20:10:28.979750Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7ff586cc2908>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD8CAYAAAB0IB+mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XlclWX+//HXh10WUQRcEAV3cFdyy9JKS81sL5usLMussaZl+o3zbZpqZmqmmqmZJquxRi0rK2sqK802l9RcUHNBBBFQEWQRBQFZz/X7A2ocQznKOec+h/N5Ph4+As59zv32lt5c3Oe6r1uMMSillGr5fKwOoJRSyjW08JVSykto4SullJfQwldKKS+hha+UUl5CC18ppbyEFr5SSnkJLXyllPISWvhKKeUl/KzacWRkpImLi7Nq90op5ZG2bNlSZIyJOpfnWlb4cXFxJCcnW7V7pZTySCKy/1yfq6d0lFLKS2jhK6WUl9DCV0opL6GFr5RSXkILXymlvIQWvlJKeQktfKWU8hJa+Eop5SW08JVSykto4SullJfQwldKKS+hha+UUl5CC18ppbyEFr5SSnmJJgtfROaLSIGI7DrN4yIiL4pIhojsEJEhjo+plFKquewZ4S8EJpzh8YlAz4Y/M4FXmh9LKaWUozVZ+MaYNUDxGTa5EnjT1NsAtBGRjo4KqJRSyjEcccerGODgSZ/nNHwtzwGvrZRDHa+sIfdYJYXHqyg4XsmRsmrKq2upqK6jvKoWmzE/besjQkigH8EBvoQG+tEuNIDosCCiwgLp1KYVoYGW3TBOqXPiiO9YaeRrppGvISIzqT/tQ5cuXRywa6UaV1pZw+7cUnbnlpKaV0pmUTn7j5RTVFbd6PZB/j6EBPjh6/Pfb+dam6GiupbKGlujz4kKCySuXTDdIkNJ6BhG35hwEjq21h8Eym054jszB4g96fPOQG5jGxpj5gHzAJKSkhr9oaDUuThcUsmGzCNsyi5mc1YxewvKfnosMjSA7lGhjEtoT1xkCDFtWhEdFkhUWCDtQgMJDfzfoj9Vnc1QVllLUXlVw28GVeQcrSC7qJzsogq+Ss3nveT6X3JFoHf7MM6Li+C8+AhGdIsgOizI6X9/pezhiMJfCswWkXeB4UCJMUZP5yinqq2zkbz/KCvTClidVsiew8cBCAv0Y0jXtkwZ2Il+MeH07dSa6NbNK1xfHyE82J/wYH+6R4X+7HFjDPmlVaTklrDzUAlb9h/lw605LNpQf6/pvp1aM7Z3FBf1jmZwl7Zn/OGilDOJMWceaIvIYmAsEAnkA48D/gDGmFdFRICXqJ/JUwHcboxJbmrHSUlJJjm5yc2U+kltnY1NWcV8tjOPFbsOc6S8Gn9fIalrBBf1iWJU90gSOrZ2i0KtrbOxO6+UtRlFrNpTyJYDR6mzGaLCApnUrwOT+nfkvLgIfNwgq/IsIrLFGJN0Ts9tqvCdRQtf2SurqJwlyQf5cGsO+aVVtPL35eKEaC7v35ELekYSFuRvdcQmlZyoYXV6Ict25LEyrYCqWhsxbVpx7dDOXD+0M7ERwVZHVB5CC1+1ODV1Nr5MyeeN77PZlFWMj8BFvaO5dmhnLuodTasAX6sjnrPyqlq+Ts3nw62H+G5vIcbAqO7tuG1UHOMS2rvFbyjKfWnhqxbjWEU1b288wFsb9pNXUkmXiGCmDovl2iGdad/Mc/HuKPfYCT7YksO7mw6QW1JJ57atuHVkV6YO60JrD/jNRbmeFr7yeAWllby+Nou3N+ynvLqOC3pGMn1UHGN7R3vFiLe2zsbXqfksWJfNxqxiwoL8uG1kHLefH0e70ECr4yk3ooWvPFZBaSX//DaD9zYfpNZmY8rATtwztge9O4RZHc0yuw6V8MqqfSzblUegnw83D+/KvWO7a/ErQAtfeaBjFdW8snofb6zPprbOcH1SLPeM6U6Xdvrm5Y/2FZbx8sp9fLQth1b+vswYHc+dF3bTUz1eTgtfeYzqWhtvrM/mxW/3UlZVy9WDYnhgXC8t+jPIKCjjha/S+XxnHm2D/XlwfC9+MawLfr66urk30sJXbs8Yw9epBTz1+W6yj1QwtncUv52Y4NWnbs7WrkMlPL0slfX7jtAzOpTHJidyYa8oq2MpF9PCV27twJEKHvtkF6vTC+keFcJjkxMZ2zva6lgeyRjDl7vzeXpZKvuPVHBpYnuemNKXTm1aWR1NuYgWvnJL1bU2Xvsukxe/2Yu/rw8Pju/FrSO74q+nIpqtqraOf6/N4sVv9uIjwkPjezF9VJye5vECWvjK7Ww/eIxfL9nO3oIyJvbrwONX9KVDeMubR2+1g8UV/P6TXaxMK6Rvp9Y8d91AEju1tjqWcqLmFL4OB5RDVdXW8cwXe7j65XWUVdUyf3oSr0wbqmXvJLERwcyffh6v3DyE/NJKrpy7lhe/2UtNXeNLOivvpgt3K4fZdaiEh97/gfT8Mm5I6szvJifqFEIXEBEm9u/IiG7teHxpCs9/lc6KlMP8/cZB9Gyvb4qr/9IRvmo2m83w2ppMrn55Hccqalhw+3k8e91ALXsXaxsSwIs3DebVaUM4XFLJ5H+uZdGG/Vh12la5Hx3hq2YpKK3k4SXb+W5vEZcmtueZawfQNiTA6lhebUK/jgzp2pZHluzgsY93sTqtgGeuHaBX6iod4atzty6jiIn/+I7N2cU8fXV//nXLUC17NxEdFsSC6efx2ORE1qQXcfmLa0nOLrY6lrKYFr46azab4cVv9jLt3xtpGxLAp7NH84vhXai/F45yFz4+wozR8Xz0y1EE+vswdd4GXv8uU0/xeDEtfHVWjlVUc/vCzTz/VTpXDuzEJ788X98YdHN9O4Xz6X2juSQhmj99nsqst7ZwvLLG6ljKAlr4ym7p+ce5cu461u8r4k9X9eOFGwcREqhvA3mC1kH+vDptKL+7PIGvUwu45uX1ZBeVWx1LuZgWvrLLipTDXD13HeVVdbw7cwTTRnTVUzgeRkS484JuLLpjGEVlVUx5aS1r0gutjqVcSAtfnZExhrkrM7h70RZ6RIfy6X3nM7RrhNWxVDOM6hHJ0tmj6dSmFdMXbGLBuiyrIykX0cJXp1Vda+ORD3bw3Io0rhzUiffuHknHcF2kqyWIjQjmw3tGMS6hPU9+upvHP9lFrV6d2+Jp4atGlVTUcNv8TXywJYdfXdKTv984iCB/z71xuPq5kEA/Xpk2lLsuiOeN7/czc9EWyqtqrY6lnEgLX/1M7rETXPvqepL3F/P8DQN5cHwvPV/fQvn6CI9ensifrurH6vRCbvjX9xQer7I6lnISLXz1P9Lzj3PtK+vJL6nkzTuGc82QzlZHUi4wbURXXr8ticzCcq57dT37j+gMnpZIC1/9ZMv+Yq5/9XtqbYb37h7JyO7trI6kXOii3tG8c9dwSk/UcO0r69l1qMTqSMrBtPAVAKvSCrj59Y1EhATwn3tG6ZrqXmpwl7YsmTWKQD9fps7bwMbMI1ZHUg6kha/4Ytdh7nozme5RoSyZNZLYCL2huDfrER3Kh/eMokN4ELct2MRqnavfYmjhe7mPtx3il+9spX9MOO/cNYJIXVFRAR3Cg3hv5gi6RYZy1xvJrEg5bHUk5QBa+F7svc0HePD9HxgWF8GiGcMJb6Xr16v/ahcayOK7RtA3pjX3vr2VpdtzrY6kmkkL30u9t/kAv/lwJxf2jGLB7efpmjiqUeHB/iyaMZykrm154N1tWvoeTgvfC/1Y9mN7R/GvW4bqBVXqjEID/Vhw+3kkxUVo6Xs4uwpfRCaISJqIZIjInEYe7yIiK0Vkm4jsEJFJjo+qHOHHsh/TK4pXp2nZK/sEB/ixUEvf4zVZ+CLiC8wFJgKJwE0iknjKZr8D3jfGDAamAi87Oqhqvo+25TDnP/VlryN7dbZOLv0H3/uBL3bpG7mexp4R/jAgwxiTaYypBt4FrjxlGwP8OHE7HNAf/27mi115/HrJDkZ2a6dlr85ZcIAfC6afx4DO4dy3eKtO2fQw9hR+DHDwpM9zGr52sieAaSKSAywD7nNIOuUQq9IKuG/xNgZ2Due1W5O07FWzhAT6sXD6MHpGh3H3omS9OMuD2FP4ja2adepNMW8CFhpjOgOTgEUi8rPXFpGZIpIsIsmFhToycIVNWcXcvWgLPaPDWHD7MJ2NoxyifvbOMGLatOKOhZvZkXPM6kjKDvYUfg4Qe9Lnnfn5KZsZwPsAxpjvgSAg8tQXMsbMM8YkGWOSoqKizi2xstvu3FJmvLGZzm1bsWjGMJ1nrxyqXWggb985grYhAUxfsJnMwjKrI6km2FP4m4GeIhIvIgHUvym79JRtDgCXAIhIAvWFr0N4Cx04UsFtCzYRGujHmzOG006voFVO0CE8iEUzhiPALf/eRH5ppdWR1Bk0WfjGmFpgNrACSKV+Nk6KiPxBRKY0bPYwcJeIbAcWA9ONMaee9lEuUni8ilvnb6S61sabd9T/2q2Us8RHhrDw9mEcq6jm1n9voqSixupI6jTEql5OSkoyycnJluy7JSuvqmXqvA3sLTjO23eOYGjXtlZHUl5iXUYRty/YzMDYcBbNGK6TA5xERLYYY5LO5bl6pW0LUltn477F20jJLWHuL4Zo2SuXOr9HJH+9YSCbs4/y6yXbsdn0l3x3o1M2WghjDE98msK3ewr401X9uCShvdWRlBeaMrATucdO8Jfle+jcNpg5E/tYHUmdRAu/hZi3JpO3Nhzg7jHdmDaiq9VxlBe7+8JuHCyu4NXV++jctpV+P7oRLfwWYPnOPP68fA+TB3TkN5fpiEpZS0R4ckpf8koq+f0nu4iNCGZML52G7Q70HL6H25lTwoPv/8CQLm346/UD8fFp7Do5pVzLz9eHf940mN4dWjP77a3szT9udSSFFr5Hyy+t5M43N9MuJJB/3aJLJij3EhLox+u3JRHo78uMN5IpLq+2OpLX08L3UCeq67jzjWTKKmt5/bYkosL0wirlfmLatOK1W4dyuLSSWW9tobrWZnUkr6aF74GMMTzywXZ25Zbwj6mDSejYuuknKWWRwV3a8tx1A9iUVczvP9mFXpNpHX3T1gO9ujqTz3bk8ZsJfRiXqNMvlfu7clAMe/PLeGllBn1jwrlFZ+5YQkf4HmZVWgHPrqifkTNrTDer4yhltwfH9+LiPtE8uTSFTVnFVsfxSlr4HiSrqJz7F2+jT4fWPHvdAER0Ro7yHL4+wgs3DqJLRDD3vr2F3GMnrI7kdbTwPUR5VS0z30zG10eYd8tQggP0bJzyPOGt/Jl361Aqa2zMemsLlTV1VkfyKlr4HsAYw5z/7GRfYRkv/WIIsRHBVkdS6pz1iA7j+RsGsiOnhCc/3W11HK+ihe8BFq7P5tPtuTx8aW/O7/Gz+8oo5XEu7duBe8Z2Z/GmAyxJPtj0E5RDaOG7ueTsYp76PJVxCe25Z0x3q+Mo5TAPj+/FqO7t+N3Hu0jJLbE6jlfQwndjRWVV/PKdrcS0bcXfbtBlE1TL4ufrw4s3DaZtcACz3tqiN05xAS18N1VnMzzw7g8cq6jhlZuH6v1oVYsUGRrIy9OGkHeskv/34Xa9KMvJtPDd1MsrM1ibUcSTU/qS2EmvpFUt15AubZkzsQ8rUvJZuD7b6jgtmha+G9qQeYQXvk7nqkGduPG8WKvjKOV0M0bHMy4hmqeXpbL94DGr47RYWvhupqisivsXbyOuXQh/urq/XlylvIKI8NfrBxIdFsTsxVspOaHn851BC9+N2GyGh97fTsmJGubePITQQL24SnmPNsEB/PMXg8k7VsmcD3fo+Xwn0MJ3I/PXZbEmvZDfTU7UFTCVVxrSpS2/vqw3y3cd5t3NOj/f0bTw3cSuQyU888UeLk1sz7ThXayOo5RlZl7QjdE9Inny0xQyCvROWY6khe8GyqtquX/xNtqFBPLMtboomvJuPj7C8zcMJDjAj/sW/6Dr7TiQFr4bePLTFLKOlPP8jQNpGxJgdRylLBfdOojnrhtAal4pz3yxx+o4LYYWvsWW78zj/eQc7h3bnVHddZ0cpX50SUJ7po+KY8G6bFanF1odp0XQwrdQQWklv/1oJwM6h/PAuF5Wx1HK7cyZ2Iee0aE8smQ7R/Um6M2mhW+R+vvS7qCypo4XbhyEv6/+Uyh1qiB/X/4+dRBHK6p59OOdOlWzmbRlLLJow35Wpxfy6KQEukeFWh1HKbfVt1M4D43vzbKdh/lo2yGr43g0LXwLZBSU8dTnqYztHcU0vZmzUk2aeWE3hsVF8PgnKeQcrbA6jsfSwnex2jobD7//A60CfHlWp2AqZRdfH+FvNwzEAI8s2YHNpqd2zoVdhS8iE0QkTUQyRGTOaba5QUR2i0iKiLzj2Jgtx7/WZLI9p4Q/XtmP6NZBVsdRymPERgTzu8sT+D7zCIs27Lc6jkdqsvBFxBeYC0wEEoGbRCTxlG16Ar8FzjfG9AUecEJWj5eaV8rfv07n8v4duWJgJ6vjKOVxbjwvlrG9o/jL8j1kF5VbHcfj2DPCHwZkGGMyjTHVwLvAladscxcw1xhzFMAYU+DYmJ6vutbGw+9vJ7yVP3+8qp/VcZTySCLCX64ZgL+v8Osl26nTUztnxZ7CjwFOXsUop+FrJ+sF9BKRdSKyQUQmNPZCIjJTRJJFJLmw0LsupJi7MoPdeaU8fXV/IvRqWqXOWYfwIJ6Y0pfk/UeZvzbL6jgexZ7Cb+xdxVN/rPoBPYGxwE3A6yLS5mdPMmaeMSbJGJMUFRV1tlk91u7cUuauzODqwTFc2reD1XGU8nhXD45hfGJ7/vplGll6asdu9hR+DnDybZc6A7mNbPOJMabGGJMFpFH/A8Dr1dTZeOSD7bQJDuDxKxKbfoJSqkkiwlNX9SPQz4fffKCzduxlT+FvBnqKSLyIBABTgaWnbPMxcBGAiERSf4on05FBPdW8NZmk5Jbyp6v60iZYT+Uo5SjRrYN4bHIim7KLeWujztqxR5OFb4ypBWYDK4BU4H1jTIqI/EFEpjRstgI4IiK7gZXAI8aYI84K7SkyCo7zj2/2cnn/jkzo19HqOEq1ONcN7cyFvepn7Rws1guymiJWrU2RlJRkkpOTLdm3K9TZDNe/up7MonK+enAMUWGBVkdSqkU6dOwElz6/msFd2rJoxrAWfzGjiGwxxiSdy3P1SlsnWfR9NlsPHOPxKxK17JVyopg2rZgzKYG1GUV8sCXH6jhuTQvfCXKPneC5FWmM6RXFVYNOncGqlHK0m4d1IalrW55alkpRWZXVcdyWFr6DGWN47ONd2Az86ap+Lf7XS6XcgY+P8Odr+lNeVcsfP9ttdRy3pYXvYMt2HuabPQU8fGkvYiOCrY6jlNfo2T6Me8f24JMfclmZphf7N0YL34FKKmp4fGkK/WPCmT4qzuo4Snmdey/qTveoEH730S4qqmutjuN2tPAd6C9f7OFoRTV/vqY/fnoHK6VcLtDPlz9fM4BDx07wwlfpVsdxO9pKDrJlfzGLNx3g9lFx9IsJtzqOUl5rWHwENw2LZf66bFLzSq2O41a08B2gps7Gox/tomN4EA+O15uRK2W130zoQ3grfx79aKcuu3ASLXwHWLgumz2Hj/P4FX0JCfSzOo5SXq9NcAD/NymBrQeO8V7ywaaf4CW08Jsp99gJXvg6nUv6RHNZ3/ZWx1FKNbh2SAzD4yP4y/I9Oje/gRZ+Mz35aQo2Y3hiSl+dc6+UGxERnrq6HxXVtTy9LNXqOG5BC78ZVqYVsCIln/sv6alz7pVyQz2iw7jrgm78Z+shNmcXWx3Hclr456iypo4nlqbQLSqEO0d3szqOUuo0Zl/cg07hQTz28S5q62xWx7GUFv45em1NJvuPVPDklL4E+OlhVMpdBQf48djkRPYcPs6iDd69br421Tk4WFzB3FUZTOrfgQt6es+tGpXyVBP6deCCnpE8/2U6hce99w1cLfxz8MfPdiMIv7tcb1molCcQEZ6c0pfK2jr+vNx738DVwj9Lq9ML+XJ3fv15wTatrI6jlLJTt6hQ7mx4AzfZS9/A1cI/C9W1Np78NIW4dsHceUG81XGUUmfpvot70KF1EE98mkKdF16Bq4V/Ft78PpvMwnIem5xIoJ+v1XGUUmcpOMCP307qw65DpSzxwitwtfDtVHi8in98vZcxvaK4uE+01XGUUudoysBOJHVty3Mr0ig5UWN1HJfSwrfTX1ekcaKmjscmJ+oVtUp5MBHhiSl9Ka6o5sVv9lodx6W08O2wM6eE97ccZPqoOHpEh1odRynVTP1iwrkxKZY31meTUXDc6jguo4XfBGMMT36aQruQAO4f19PqOEopB/n1Zb1pFeDLHz/znmmaWvhN+HxnHsn7j/Lwpb1pHeRvdRyllINEhgZy/8U9WZ1eyCovuQeuFv4ZVNbU8Zfle+jTIYwbkmKtjqOUcrBbR3Wla7tgnvo81SvW2dHCP4MF67LJOXqCxyYn4uujb9Qq1dIE+vny24kJ7C0oY/GmA1bHcTot/NMoPF7F3JUZjEuI5vwekVbHUUo5yWV92zM8PoLnv0pv8dM0tfBP4/mv0qmsqeP/JiVYHUUp5UQiwmOTEzl2ooaXvm3Z0zS18BuRdvg4720+wC0ju9ItSqdhKtXS9YsJ57ohnVm4Ppv9R8qtjuM0WviN+PPyVEID/fjVJToNUylv8evLeuPn48OzK9KsjuI0dhW+iEwQkTQRyRCROWfY7joRMSKS5LiIrrV2bxGr0gqZfXEP2gQHWB1HKeUi7VsHcdcF8Xy+I49tB45aHccpmix8EfEF5gITgUTgJhH52ULwIhIG3A9sdHRIV7HZDE8vSyWmTStuHRlndRyllIvNHNOdyNAAnl6WijEtbzVNe0b4w4AMY0ymMaYaeBe4spHt/gg8C1Q6MJ9LfbTtELvzSvl/E3oT5K+rYSrlbUID/XhwfC82Zx/ly935VsdxOHsKPwY4eR3RnIav/UREBgOxxpjPHJjNpSpr6vjbl2kM6BzOFQM6WR1HKWWRG5Ni6REdyjPL91DTwi7GsqfwG7vi6KffdUTEB3gBeLjJFxKZKSLJIpJcWFhof0oXWLAum9ySSv5vUgI+epGVUl7Lz9eHORP6kFlUzrst7GIsewo/Bzh5XYHOQO5Jn4cB/YBVIpINjACWNvbGrTFmnjEmyRiTFBXlPjf/PlZRzcurMri4TzQjurWzOo5SymKXJEQzLD6Cf3yTQXlVrdVxHMaewt8M9BSReBEJAKYCS3980BhTYoyJNMbEGWPigA3AFGNMslMSO8HLq/ZRVlXLbyb0sTqKUsoNiAhzJvahqKyKf6/NsjqOwzRZ+MaYWmA2sAJIBd43xqSIyB9EZIqzAzpb7rETLFyfzTWDO9O7Q5jVcZRSbmJIl7Zc1rc989ZkcqSsyuo4DmHXPHxjzDJjTC9jTHdjzFMNX/u9MWZpI9uO9aTR/QtfpQPw0KW9LE6ilHI3j1zWh4rqWl5amWF1FIfw6itt0/OP8+HWHG4d0ZWYNq2sjqOUcjM9okO5ISmWtzbs52BxhdVxms2rC//ZL9IICfDjlxf1sDqKUspNPTCuFz4i/O1Lz19ywWsLf8v+o3ydms+ssd1pG6JLKCilGtchPIjbz4/nk+257DlcanWcZvHKwjfG8NyKPUSGBnD7+XFWx1FKublZY7oRGujH375MtzpKs3hl4a/LOMKGzGJmX9SD4AA/q+Mopdxcm+AA7r6wG1/tzvfohdW8rvB/HN3HtGnFTcO7WB1HKeUhbj8/nnYhAfzVg8/le13hr0jJZ3tOCb8a15NAP10gTSlln5DA+gke6zKOsC6jyOo458SrCr/OZvjbl2l0jwrhmsExTT9BKaVO8ovhXegUHsSzK9I8cvlkryr8pdsPsbegjIfG98bP16v+6kopBwjy9+WBcb3YfvAYX6cWWB3nrHlN69XW2fjH13tJ6Niaif06WB1HKeWhrhkSQ1y7YJ7/Kh2bzbNG+V5T+P/ZeojsIxU8NL6XLn+slDpnfr4+/GpcT1LzSvki5bDVcc6KVxR+da2NF7/dy4DO4YxLiLY6jlLKw00ZGEOP6FBe+CqdOg8a5XtF4S/ZcpCcoyd4cHwvRHR0r5RqHl8f4YFxPdlbUMZnO3KbfoKbaPGFX1lTx0vfZjCkSxvG9nKfm64opTzbpH4d6dMhjH98vZdaD7kVYosv/Hc3HSCvpJKHL+2to3ullMP4+AgPjOtFZlE5H//gGaP8Fl34lTV1vLxqH8PiIhjVXW9dqJRyrMv6tqdfTGv++a1njPJbdOG/u+kABcereGB8Tx3dK6UcTkT41SW92H+kwiNG+S228Ctr6nhl9T6GxUcwUm9MrpRyknEJ0fTt1JqXPGCU32IL/73NB8kvreKBcTq6V0o5j0j9ufzsIxV84uaj/BZZ+PXn7jMYFqeje6WU8/04ynf3c/ktsvB1dK+UcqX6c/k93X6U3+IK/39G9zozRynlIuMT25PY0b1H+S2u8JdsySG/tIr7L9HRvVLKdUSEX42rH+V/tiPP6jiNalGFX1Nn49VV+xjcpQ3n99DRvVLKtcYntKd3+zBeWpnhlitptqjC/2jrIQ4dO8H9F+voXinlej4+wuyLe5BRUOaWK2m2mMKvrbMxd1UG/WPCGdtb18xRSlljUv+OdIsK4Z/fZrjdXbFaTOF/uiOX/UcqmH1xDx3dK6Us4+sjzL6oB6l5pW53V6wWUfg2m+GlbzPo3T6M8QntrY6jlPJyUwZ2oktEMC99u9etRvktovCX7zrMvsJyZl/cQ+9mpZSynJ+vD/eO7c72nBLW7C2yOs5PPL7wjTHMXZlBt8gQJvXvaHUcpZQC4JohnekYHsTclRlWR/mJxxf+qvRCdueVMmtsd3x1dK+UchMBfj7MvLAbm7KK2ZxdbHUcwM7CF5EJIpImIhkiMqeRxx8Skd0iskNEvhGRro6P2riXV2bQKTyIqwbFuGqXSilll6nndSEiJICX3WSU32Thi4gvMBeYCCQCN4lI4imbbQOSjDEDgA+AZx0dtDH1PzmPMvPCbgT4efwvK0qpFqZVgC8zRsezMq2QlNwSq+PYNcIfBmQYYzKNMdXAu8CVJ29gjFlpjKlo+HQD0NmxMRs3d2UG7ULw403xAAALwUlEQVQCuPG8Lq7YnVJKnbVpI7oSFujHy6v2WR3FrsKPAQ6e9HlOw9dOZwawvLEHRGSmiCSLSHJhYaH9KRux61AJq9MLuWN0PK0CfJv1Wkop5Szhrfy5ZWRXlu3MI7OwzNIs9hR+Y++ENjqxVESmAUnAc409boyZZ4xJMsYkRUU172rYl1dlEBboxy0jXfZ2gVJKnZM7RscT4OvDq6utHeXbU/g5QOxJn3cGfrbgs4iMAx4FphhjqhwTr3GZhWUs33WYaSO70jrI35m7UkqpZosMDWTqebF8tO0QeSUnLMthT+FvBnqKSLyIBABTgaUnbyAig4F/UV/2Tr+W+LXvMvH39eGO8+OdvSullHKIOy/ohs3A/LVZlmVosvCNMbXAbGAFkAq8b4xJEZE/iMiUhs2eA0KBJSLyg4gsPc3LNVtBaSUfbjnEdUM7ExUW6KzdKKWUQ8VGBDN5QEfe2XiAkooaSzL42bORMWYZsOyUr/3+pI/HOTjXac1fl02tzcbMC7q5apdKKeUQd1/YnU9+yOWtjfv55UU9XL5/j5q8XlpZw9sb9jOxf0fiIkOsjqOUUmclsVNrxvaOYsG6LCpr6ly+f48q/Lc3HOB4VS33jOludRSllDons8Z0p6ismiVbcly+b48p/KraOuavy2J0j0j6xYRbHUcppc7J8PgIBsW24bU1mS6/2bnHFP7H2w5ReLyKWTq6V0p5MBFh1pjuHCiuYEVKvkv37RGFb7MZ5q3JJLFja705uVLK441PbE98ZAjz1uxz6Q1SPKLwv91TwL7Ccu4e001vX6iU8ni+PsKM0fFszylhY5brlk72iMKf910mncKD9AYnSqkW47qhnWkXEsBrazJdtk+3L/wfDh5jU1Yxd4yOx9/X7eMqpZRdgvx9uXVkHN/sKWBv/nGX7NPtG3Temn2EBfkxdZgugayUalluGdmVIH8fXvvONaN8ty78/UfK+WLXYaaN6EpooF0XBSullMeICAng+qGxfLwtl4LSSqfvz60Lf/7aLHx9hOmj4qyOopRSTjFjdDy1NhsL12c7fV9uW/glFTW8n5zDlYNiaN86yOo4SinlFHGRIVya2IF3Nh2gorrWqfty28J/Z9MBTtTUMWO0LoGslGrZ7rwgnmMVNXy49ZBT9+OWhV9da2Ph+vplFBI6trY6jlJKOdXQrm0ZGNuG+WuzsNmcdyGWWxb+5ztzyS+tYsYFOrpXSrV8IsKdo+PJKirnmz3Ou4eU2xW+MYbXv8uiR3QoY3o27763SinlKSb260BMm1a87sQpmm5X+Bsyi0nJLWXG6Hh8fHQZBaWUd/Dz9WH6qDg2ZhWzM6fEKftwu8L/99pM2oUEcPXgGKujKKWUS904LJbQQD9eX+ucUb5bFX5WUTlfpxZw84iuBPn7Wh1HKaVcqnWQPzckxfL5jjwOlzj+Qiy3Kvw31mfj7ytMG6HLKCilvNP0UXHUGcNbG/Y7/LXdpvBLTtTwfvJBrhjYiegwvdBKKeWdurQLZnxCe97euN/h9711m8JfknyQiuo67jhfp2IqpbzbHaPjOVpRw8fbHHshllsUfp3NsHB9NsPiI/R+tUoprzc8PoLEjq1ZsC7boXfEcovC/2p3PjlHT+joXimlqL8Q647R8aTlH2f9viMOe123KPz567Lo3LYV4xPbWx1FKaXcwhUDOxIZGsD8tVkOe03LC3/XoRI2ZRUzfVQcvnqhlVJKARDo58vNw7vyzZ4CsorKHfKalhf+wvXZBAf4cn1SrNVRlFLKrdw8ogv+vsIbDlor39LCP1JWxdLtuVw7pDPhrfytjKKUUm4nOiyIyQM68cGWHMqqmr9WvqWF/+7mg1TX2rhtVFcrYyillNu6bVQcZVW1fLglp9mvZVnhG+CtDfu5oGckPaLDrIqhlFJubVBsGwbFtuGN77ObvVa+XYUvIhNEJE1EMkRkTiOPB4rIew2PbxSRuKZes/REDXklldw2sslNlVLKq00fFUdmYTnfZRQ163WaLHwR8QXmAhOBROAmEUk8ZbMZwFFjTA/gBeCZpl73SFkVXSKCuahP9NmnVkopLzKpf0eiwgJZuK55UzTtGeEPAzKMMZnGmGrgXeDKU7a5Enij4eMPgEtE5IxzLMur67h1ZFediqmUUk0I8PPhF8O6sDKtsFmvY0/hxwAHT/o8p+FrjW5jjKkFSoB2Z9yxiE7FVEopO908vH6KZnP42bFNY3s49Z0De7ZBRGYCMxs+rWoTHLDLjv1bLRJo3okz19CcjuMJGUFzOpqn5Ox9rk+0p/BzgJOH4p2B3NNskyMifkA4UHzqCxlj5gHzAEQk2RiTdC6hXUlzOpYn5PSEjKA5Hc2Tcp7rc+05pbMZ6Cki8SISAEwFlp6yzVLgtoaPrwO+NY5c4k0ppVSzNTnCN8bUishsYAXgC8w3xqSIyB+AZGPMUuDfwCIRyaB+ZD/VmaGVUkqdPXtO6WCMWQYsO+Vrvz/p40rg+rPc97yz3N4qmtOxPCGnJ2QEzeloLT6n6JkXpZTyDpavlqmUUso1XFb4IvKciOwRkR0i8pGItDnNdmdcxsEFOa8XkRQRsYnIad+xF5FsEdkpIj80513zc3UWOa0+nhEi8pWI7G34b9vTbFfXcCx/EJFTJwU4K5vDlwxxBjtyTheRwpOO350WZJwvIgUi0uhUa6n3YsPfYYeIDHF1xoYcTeUcKyIlJx3L3ze2nbOJSKyIrBSR1Ib/z3/VyDZnf0yNMS75A1wK+DV8/AzwTCPb+AL7gG5AALAdSHRVxoYMCdTPc10FJJ1hu2wg0pXZzjanmxzPZ4E5DR/PaezfveGxMhfnavLYAPcCrzZ8PBV4z4J/Z3tyTgdecnW2UzJcCAwBdp3m8UnAcuqv2RkBbHTTnGOBz6w8lg05OgJDGj4OA9Ib+Xc/62PqshG+MeZLU38VLsAG6ufzn8qeZRycyhiTaoxJc+U+z4WdOS0/nvzvshtvAFe5eP+n45QlQ5zAHf4Nm2SMWUMj196c5ErgTVNvA9BGRDq6Jt1/2ZHTLRhj8owxWxs+Pg6k8vMVDs76mFp1Dv8O6n8yncqeZRzchQG+FJEtDVcQuyN3OJ7tjTF5UP9NDJxutbwgEUkWkQ0i4oofCk5ZMsQJ7P03vLbh1/oPRMQd1yxxh+9Fe40Uke0islxE+lodpuFU4mBg4ykPnfUxtWta5lkE+xro0MhDjxpjPmnY5lGgFni7sZdo5GsOn0ZkT047nG+MyRWRaOArEdnTMHpwGAfktPx4nsXLdGk4nt2Ab0VkpzFmn2MSNsphS4Y4mT0ZPgUWG2OqRGQW9b+VXOz0ZGfHHY6lPbYCXY0xZSIyCfgY6GlVGBEJBT4EHjDGlJ76cCNPOeMxdWjhG2PGnelxEbkNmAxcYhpOQp3CnmUcmq2pnHa+Rm7DfwtE5CPqf/V2aOE7IKflx1NE8kWkozEmr+HXzYLTvMaPxzNTRFZRP6JxZuE7bMkQJ2sypzHmyEmfvoYdy5NbwCXfi811cqkaY5aJyMsiEmmMcfkaOyLiT33Zv22M+U8jm5z1MXXlLJ0JwG+AKcaYitNsZs8yDpYTkRARCfvxY+rfkHbHheDc4XievOzGbcDPfjMRkbYiEtjwcSRwPrDbybk8ZcmQJnOect52CvXne93NUuDWhpklI4CSH0/1uRMR6fDj+zQiMoz6jjxy5mc5JYdQv4JBqjHm+dNsdvbH1IXvOmdQf77ph4Y/P85+6AQsO+Wd53TqR3ePuirfSfu/mvqfnFVAPrDi1JzUz5jY3vAnxV1zusnxbAd8A+xt+G9Ew9eTgNcbPh4F7Gw4njuBGS7K9rNjA/yB+kEJQBCwpOF7dxPQzdXHz86cf274PtwOrAT6WJBxMZAH1DR8X84AZgGzGh4X6m+ktK/h3/i0M+Aszjn7pGO5ARhlUc7R1J+e2XFSZ05q7jHVK22VUspL6JW2SinlJbTwlVLKS2jhK6WUl9DCV0opL6GFr5RSXkILXymlvIQWvlJKeQktfKWU8hL/H7ZN2jnTpgklAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "%matplotlib inline\n",
    "x = np.linspace(-2, 2, 100)\n",
    "plt.xlim(-2, 2)\n",
    "plt.ylim(0, 1.1)\n",
    "plt.plot(x, 1-x**2/4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is the kernel that performs the classification. We perform the post-selection on observing 0 on the measurement on the ancilla and calculate the probabilities of the test instance belonging to either class:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:29.367970Z",
     "start_time": "2018-11-19T20:10:29.353333Z"
    }
   },
   "outputs": [],
   "source": [
    "def postselect(result_counts):\n",
    "    total_samples = sum(result_counts.values())\n",
    "\n",
    "    # define lambda function that retrieves only results where the ancilla is in the |0> state\n",
    "    post_select = lambda counts: [(state, occurences) for state, occurences in counts.items() if state[-1] == '0']\n",
    "\n",
    "    # perform the postselection\n",
    "    postselection = dict(post_select(result_counts))\n",
    "    postselected_samples = sum(postselection.values())\n",
    "\n",
    "    print(f'Ancilla post-selection probability was found to be {postselected_samples/total_samples}')\n",
    "\n",
    "    retrieve_class = lambda binary_class: [occurences for state, occurences in postselection.items() if state[0] == str(binary_class)]\n",
    "\n",
    "    prob_class0 = sum(retrieve_class(0))/postselected_samples\n",
    "    prob_class1 = sum(retrieve_class(1))/postselected_samples\n",
    "\n",
    "    print('Probability for class 0 is', prob_class0)\n",
    "    print('Probability for class 1 is', prob_class1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For the first instance we have:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:35.339972Z",
     "start_time": "2018-11-19T20:10:29.370281Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/marshmallow/schema.py:364: ChangedInMarshmallow3Warning: strict=False is not recommended. In marshmallow 3.0, schemas will always be strict. See https://marshmallow.readthedocs.io/en/latest/upgrading.html#schemas-are-always-strict\n",
      "  ChangedInMarshmallow3Warning\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ancilla post-selection probability was found to be 0.701171875\n",
      "Probability for class 0 is 0.6559888579387186\n",
      "Probability for class 1 is 0.34401114206128136\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/pwittek/.anaconda3/envs/qiskit/lib/python3.7/site-packages/marshmallow/schema.py:364: ChangedInMarshmallow3Warning: strict=False is not recommended. In marshmallow 3.0, schemas will always be strict. See https://marshmallow.readthedocs.io/en/latest/upgrading.html#schemas-are-always-strict\n",
      "  ChangedInMarshmallow3Warning\n"
     ]
    }
   ],
   "source": [
    "qc0 = interfere_data_and_test_instances(state_preparation_0, q, c, angles)\n",
    "job = execute(qc0, backend)\n",
    "result = job.result()\n",
    "postselect(result.get_counts(qc0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And for the second one:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-11-19T20:10:40.015253Z",
     "start_time": "2018-11-19T20:10:35.354484Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ancilla post-selection probability was found to be 0.935546875\n",
      "Probability for class 0 is 0.5501043841336117\n",
      "Probability for class 1 is 0.4498956158663883\n"
     ]
    }
   ],
   "source": [
    "angles = [test_angles[1], training_angle]\n",
    "state_preparation_1 = prepare_state(q, c, angles)\n",
    "qc1 = interfere_data_and_test_instances(state_preparation_1, q, c, angles)\n",
    "job = execute(qc1, backend)\n",
    "result = job.result()\n",
    "postselect(result.get_counts(qc1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# References\n",
    "\n",
    "[1] M. Schuld, M. Fingerhuth, F. Petruccione. (2017). [Implementing a distance-based classifier with a quantum interference circuit](https://doi.org/10.1209/0295-5075/119/60002). *Europhysics Letters*, 119(6), 60002. <a id='1'></a>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
